package Leetcode.每日一题;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author kirito
 * @Date 2023/10/16 10:17
 * @PackageName:Leetcode.每日一题
 * @ClassName: 只出现一次的数字3
 * @Description:
 * 给你一个整数数组 nums，其中恰好有两个元素只出现一次，其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
 *
 * 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [1,2,1,3,2,5]
 * 输出：[3,5]
 * 解释：[5, 3] 也是有效的答案。
 * 示例 2：
 *
 * 输入：nums = [-1,0]
 * 输出：[-1,0]
 * 示例 3：
 *
 * 输入：nums = [0,1]
 * 输出：[1,0]
 * @Version 1.0
 */
public class 只出现一次的数字3 {
    //哈希
    public int[] singleNumber(int[] nums) {
        Map<Integer, Integer> freq = new HashMap<Integer, Integer>();
        for (int num : nums) {
            freq.put(num, freq.getOrDefault(num, 0) + 1);
        }
        int[] ans = new int[2];
        int index = 0;
        for (Map.Entry<Integer, Integer> entry : freq.entrySet()) {
            if (entry.getValue() == 1) {
                ans[index++] = entry.getKey();
            }
        }
        return ans;
    }
    //位运算  不会。。
    public int[] singleNumber2(int[] nums) {
        int[] result = new int[2];



        return result;
    }

    //先排序  然后规律计算，巧解！
    public int[] singleNumber3(int[] nums) {
        int n=nums.length;
        if(n==2) return nums;
        int[] ans=new int[2];
        int idx=0;
        Arrays.sort(nums);
        if(nums[0]!=nums[1]){
            ans[idx]=nums[0];
            idx++;
        }
        for(int i=1;i<n-1;i++){
            if(nums[i-1]!=nums[i] && nums[i]!=nums[i+1]){
                ans[idx]=nums[i];
                idx++;
            }
        }
        if(nums[n-2]!=nums[n-1]){
            ans[idx]=nums[n-1];
            idx++;
        }
        return ans;
    }















}
